package com.yuyue.note01.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

import javax.servlet.Filter;

/**
 * servlet初始化实现类
 */
//定义一个 servlet 容器启动的配置类，在里面加载 Spring 的配置
//public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
//    //加载 Spring MVC 容器配置
//    @Override
//    protected WebApplicationContext createServletApplicationContext() {
//        //使用注解的web上下文注册 Spring MVC 容器配置
//        AnnotationConfigWebApplicationContext applicationContext =
//                new AnnotationConfigWebApplicationContext();
//        applicationContext.register(SpringMVCConfig.class);
//
//        return applicationContext;
//    }
//
//    //设置那些请求归属 Spring MVC 处理
//    @Override
//    protected String[] getServletMappings() {
//        //处理所有请求
//        return new String[]{"/"};
//    }
//
//    //加载 Spring 容器配置
//    @Override
//    protected WebApplicationContext createRootApplicationContext() {
//        return null;
//    }
//}


/**
 * servlet初始化实现类
 * 以Spring MVC的注解抽象子类作为继承对象，简化开发
 * 对比上面的实现，仅需返回配置类的字节码
 */
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    //加载 Spring MVC 容器配置
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMVCConfig.class};
    }

    //设置那些请求归属 Spring MVC 处理
    @Override
    protected String[] getServletMappings() {
        //处理所有请求
        return new String[]{"/"};
    }

    //加载 Spring 容器配置
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    /**
     * 使用过滤器处理中文乱码问题
     * 重写获取过滤器方法设置过滤器 AbstractDispatcherServletInitializer#getServletFilters
     * @return
     */
    @Override
    protected Filter[] getServletFilters(){
        //使用Spring的编码过滤器
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        return new Filter[]{filter};
    }
}